[QEMU] Do shift-key processing in QEMU monitor terminal when connected via VNC.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 30 Nov 2006 17:47:50 +0000 (17:47 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 30 Nov 2006 17:47:50 +0000 (17:47 +0000)
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
tools/ioemu/vnc.c

index 631754ca0344f00477d0acffb3aef38ab3ec3e2e..86d3720f903c6fabf8b995505b3ec028167cc551 100644 (file)
@@ -114,6 +114,7 @@ struct VncState
     int visible_h;
 
     int ctl_keys;               /* Ctrl+Alt starts calibration */
+    int shift_keys;             /* Shift / CapsLock keys */
 };
 
 #define DIRTY_PIXEL_BITS 64
@@ -870,9 +871,12 @@ static void do_key_event(VncState *vs, int down, uint32_t sym)
     } else if (down) {
        int qemu_keysym = 0;
 
-       if (sym <= 128) /* normal ascii */
+       if (sym <= 128) { /* normal ascii */
+           int shifted = vs->shift_keys == 1 || vs->shift_keys == 2;
            qemu_keysym = sym;
-       else {
+           if (sym >= 'a' && sym <= 'z' && shifted)
+               qemu_keysym -= 'a' - 'A';
+       } else {
            switch (sym) {
            case XK_Up: qemu_keysym = QEMU_KEY_UP; break;
            case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break;
@@ -903,6 +907,10 @@ static void do_key_event(VncState *vs, int down, uint32_t sym)
            vs->ctl_keys |= 2;
            break;
 
+       case XK_Shift_L:
+           vs->shift_keys |= 1;
+           break;
+
        default:
            break;
        }
@@ -916,6 +924,14 @@ static void do_key_event(VncState *vs, int down, uint32_t sym)
            vs->ctl_keys &= ~2;
            break;
 
+       case XK_Shift_L:
+           vs->shift_keys &= ~1;
+           break;
+
+       case XK_Caps_Lock:
+           vs->shift_keys ^= 2;
+           break;
+
        case XK_1 ... XK_9:
            if ((vs->ctl_keys & 3) != 3)
                break;